package vd

import (
	"fmt"
	"github.com/henrylee2cn/ameda"
	"github.com/samber/lo"
	"regexp"
)

func SqlInjectFilter() {
	ValidateConfig.MustRegValidateFunc("sif", func(args ...interface{}) error {
		if len(args) != 1 {
			return fmt.Errorf("the args must be one")
		}
		s, _ := args[0].(string)

		if SQLInjectFilter(s) {
			return fmt.Errorf("搜索关键字含有非法字符")
		}
		return nil
	})
}

//func In() {
//	binding.MustRegValidateFunc("in", func(args ...interface{}) error {
//		if len(args) < 2 {
//			return fmt.Errorf("vd in args must have two at least")
//		}
//		//s, _ := args[0].(int8)
//		if util.InArray(args[0], args[1:]) {
//			return fmt.Errorf("参数错误")
//		}
//		return nil
//	})
//}
//

// usage range($,1,5) -- 必须为int类型数字
func Range() {
	ValidateConfig.MustRegValidateFunc("range", func(args ...interface{}) error {
		if len(args) < 2 {
			return fmt.Errorf("vd in args must have two at least")
		}
		fv, fmin, fmax := args[0].(float64), args[1].(float64), args[2].(float64)
		v, _ := ameda.Float64ToInt(fv)
		min, _ := ameda.Float64ToInt(fmin)
		max, _ := ameda.Float64ToInt(fmax)
		if !lo.Contains(lo.RangeFrom(min, max), v) {
			return fmt.Errorf("必须在%d-%d之间", min, max)
		}
		return nil
	})
}

//func Json() {
//	binding.MustRegValidateFunc("json", func(args ...interface{}) error {
//		if len(args) != 1 {
//			return fmt.Errorf("the args must be one")
//		}
//		s, _ := args[0].(string)
//		if !jsoniter.Valid([]byte(s)) {
//			return fmt.Errorf("必须为json格式")
//		}
//		return nil
//	})
//}

func IsNull() {
	ValidateConfig.MustRegValidateFunc("isnull", func(args ...interface{}) error {
		if len(args) != 1 {
			return fmt.Errorf("the args must be one")
		}
		s, _ := args[0].(string)
		if lo.IsEmpty(s) {
			return fmt.Errorf("不能为空")
		}
		return nil
	})

	//binding.MustRegValidateFunc("isnull", func(args ...interface{}) error {
	//binding.MustRegValidateFunc("isnull", func(args ...interface{}) error {
	//	if len(args) != 1 {
	//		return fmt.Errorf("the args must be one")
	//	}
	//	s, _ := args[0].(string)
	//	if lo.IsEmpty(s) {
	//		return fmt.Errorf("不能为空")
	//	}
	//	return nil
	//})
}

func IsNullWithSif() {
	ValidateConfig.MustRegValidateFunc("isnullsif", func(args ...interface{}) error {
		if len(args) != 1 {
			return fmt.Errorf("the args must be one")
		}
		s, _ := args[0].(string)
		if lo.IsEmpty(s) {
			return fmt.Errorf("不能为空")
		}
		if SQLInjectFilter(s) {
			return fmt.Errorf("包含非法字符")
		}
		return nil
	})
}

func Mobile() {
	ValidateConfig.MustRegValidateFunc("mobile", func(args ...interface{}) error {
		if len(args) != 1 {
			return fmt.Errorf("the args must be one")
		}
		s, _ := args[0].(string)

		regex := `^1[3456789]\d{9}$`
		if isMobile, _ := regexp.MatchString(regex, s); !isMobile {
			return fmt.Errorf("请输入正确的手机号")
		}
		return nil
	})
}

// 正则过滤sql注入的方法
// 参数 : 要匹配的语句
func SQLInjectFilter(sql string) bool {
	//过滤 ‘
	//ORACLE 注解 --  /**/
	//关键字过滤 update ,delete
	// 正则的字符串, 不能用 " " 因为" "里面的内容会转义
	str := `(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|(\b(select|update|and|or|delete|insert|trancate|char|chr|into|substr|ascii|declare|exec|count|master|into|drop|execute)\b)`
	re, err := regexp.Compile(str)
	if err != nil {
		panic(err.Error())
		return false
	}
	return re.MatchString(sql)
}
